#include <bits/stdc++.h>
using namespace std;
struct car
{
    int d,v,a;
};
int main()
{
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    int T,NUM[20],SUM[20];
    cin>>T;
    for(int i=0;i<T;i++)
    {
        int n,m,L,V;
        cin>>n>>m>>L>>V;
        car num[n+1];
        int check[m+1];
        bool need[m+1][n+1];
        memset(need,0,sizeof(need));
        for(int j=1;j<=n;j++)
        {
            cin>>num[j].d>>num[j].v>>num[j].a;
        }
        for(int j=1;j<=m;j++)
        {
            cin>>check[j];
        }
        int sum=0;
        for(int j=1;j<=n;j++)
        {
            if(num[j].d>check[m])continue;
            if(num[j].a==0)//not a
            {
                if(num[j].v<=V) continue;
                else
                {
                    sum++;
                    for(int k=1;k<=m;k++)
                    {
                        if(check[k]>num[j].d) need[j][k]=1;
                    }
                }
            }
            else if(num[j].a>0)//fast
            {
                if(num[j].v>V)
                {
                     sum++;
                    for(int k=1;k<=m;k++)
                    {
                        if(check[k]>num[j].d) need[j][k]=1;
                    }
                }
                else
                {
                    int s=(V*V-num[j].v*num[j].v)/(2*num[j].a);
                    if(num[j].d+s>L) continue;
                    sum++;
                    for(int k=1;k<=m;k++)
                    {
                        if(check[k]>num[j].d+s) need[j][k]=1;
                    }
                }
            }
            else//slow
            {
                if(num[j].v<=V) continue;
                else
                {
                    int s=(V*V-num[j].v*num[j].v)/(2*num[j].a);
                    if(num[j].d+s>L)
                    {
                         sum++;
                        for(int k=1;k<=m;k++)
                        {
                            if(check[k]>num[j].d) need[j][k]=1;
                        }
                    }
                    else
                    {
                        int b=false;
                        for(int k=1;k<=m;k++)
                        {
                            if(check[k]<num[j].d+s)
                            {
                                if(check[k]>=num[j].d)
                                {
                                    need[j][k]=1;
                                    b=true;
                                }
                            }
                        }
                        if(b==true) sum++;
                    }
                }
            }
        }
        int ans=0;
        SUM[i]=sum;
        for(int f=0;f<m;f++)
        {
            int all[n+1];
            memset(all,0,sizeof(all));
            for(int j=1;j<=n;j++)
            {
                for(int k=1;k<=m;k++)
                {
                    all[j]+=need[k][j];
                }
            }
            int maxc=0,maxnum=1;
            for(int j=1;j<=n;j++)
            {
                if(all[j]>maxc)
                {
                    maxnum=j;
                    maxc=all[j];
                }
            }
            if(maxc>0) ans++;
            for(int j=1;j<=m;j++)
            {
                if(need[j][maxnum]==1)
                {
                    for(int k=1;k<=n;k++)
                    {
                        need[j][k]=0;
                    }
                }
            }

        }
        NUM[i]=m-ans;
    }
    for(int i=0;i<T;i++)
    {
        cout<<SUM[i]<<" "<<NUM[i]<<endl;
    }
    return 0;
}
